/*
 * Copyright (c) 2012 SUBSECRETARIA DEFENSORIA DEL ESPACIO PUBLICO - SDEP.
 * All Rights Reserved.
 * This software is the confidential and proprietary information of SDEP
 * Developed By CONSTULT-SOFT S.A, Development Team 2012.
 *
 */
package co.gov.medellin.sdep.sisdep.domain.gestion;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import co.gov.medellin.sdep.sisdep.common.AppConstants;
import co.gov.medellin.sdep.sisdep.common.OracleHelper;
import co.gov.medellin.sdep.sisdep.domain.BaseController;
import co.gov.medellin.sdep.sisdep.domain.MessageModalWindowController;
import co.gov.medellin.sdep.sisdep.gestion.exception.SensibilizacionException;
import co.gov.medellin.sdep.sisdep.gestion.exception.SensibilizacionRuntimeException;
import co.gov.medellin.sdep.sisdep.gestion.service.ISensibilizacionService;
import co.gov.medellin.sdep.sisdep.integration.mapasmedellin.BeanDireccion;
import co.gov.medellin.sdep.sisdep.integration.mapasmedellin.GeoUbicacionClient;
import co.gov.medellin.sdep.sisdep.model.Sensibilizacion;

/**
 * @author acespedes
 * 
 */
public class SensibilizacionController extends BaseController implements
		Serializable {

	/**
	 * generated serial version
	 */
	private static final long serialVersionUID = -3285110767384990403L;

	/**
	 * Constructor por defecto, inicializa los elemento basicos del Controlador
	 */
	public SensibilizacionController() {
		cleanSearchValues();
		cleanValues();
	}

	/** bean para el manejo del formulario de busqueda Sensibilizacion */
	private Sensibilizacion sensibilizacionSearch = new Sensibilizacion();

	/** bean para el manejo del formulario de creacion/edicion. Sensibilizacion */
	private Sensibilizacion sensibilizacion = new Sensibilizacion();

	/** Objeto contenedor del listado de Sensibilizacion luego de una consulta. */
	private DataModel sensibilizacionListModel;

	/** instancia de servicio sensibilizacionService */
	private ISensibilizacionService sensibilizacionService;

	/**
	 * cliente de consumo del web service de georeferenciacion
	 */
	private GeoUbicacionClient geoUbicacionClient;

	/**
	 * instancia un objeto de direccion local, en caso que el usuario no valide
	 * direccion al menos una vez
	 */
	private BeanDireccion direccionLocal = new BeanDireccion();

	// --------------------------------------------------------------------
	// --- metodos para atender acciones init()
	// --------------------------------------------------------------------

	/**
	 * 
	 * @return String
	 */
	public String searchSensibilizacionByKey() {
		String msg = "";
		try {
			List valores = null;
			valores = getSensibilizacionService().load(1, 10,
					this.sensibilizacionSearch);
			this.sensibilizacionListModel.setWrappedData(valores);
		} catch (Exception e) {
			msg = e.getMessage();
			e.printStackTrace(System.err);
		}
		if (this.sensibilizacionListModel.getWrappedData() == null) {
			msg = AppConstants.NO_RECORDS_FOUND;
		} else {
			if (((List) this.sensibilizacionListModel.getWrappedData())
					.isEmpty()) {
				msg = AppConstants.NO_RECORDS_FOUND;
			}
		}
		((MessageModalWindowController) getBean("messageController"))
				.setSuccessMessage(msg, null, null);
		return AppConstants.SENSIBILIZACION_SEARCH_VIEW;
	}

	/**
	 * limpia el contenido de los valores que se ingresan (Create, Update)
	 */
	public final void cleanValues() {
		sensibilizacion.setId(new Long(0L));
		sensibilizacion.setIdSensibilizacionTipo(new Long(0L));
		sensibilizacion.setIdArea(new Long(0L));
		sensibilizacion.setCodigo("");
		sensibilizacion.setFecha(null);
		sensibilizacion.setDireccionResidencia("");
		sensibilizacion.setCodigoBarrio("");
		sensibilizacion.setBarrio("");
		sensibilizacion.setCodigoComuna("");
		sensibilizacion.setComuna("");
		sensibilizacion.setLugar("");
		sensibilizacion.setEstablecimiento("");
		sensibilizacion.setTelefono("");
		sensibilizacion.setEstado("");
		//TOUCH
	}

	/**
	 * limpia el contenido de los valores que se ingresan para buscar
	 */
	public final void cleanSearchValues() {
		sensibilizacionSearch.setIdSensibilizacionTipoStr("");
		sensibilizacionSearch.setIdAreaStr("");
		sensibilizacionSearch.setCodigo("");
		this.sensibilizacionListModel = new ListDataModel();

		((MessageModalWindowController) getBean("messageController"))
				.clearMessage();
	}

	/**
	 * Valida el barrio y comuna de la direccion enviada a traves del web
	 * service de georeferencia
	 * 
	 * @return
	 */
	public String checkAddress() {
		direccionLocal = getGeoUbicacionClient().getAddressLocalization(
				this.sensibilizacion.getDireccionResidencia());
		if (null == direccionLocal) {
			direccionLocal = new BeanDireccion();
		}
		sensibilizacion.setCodigoBarrio(OracleHelper
				.isNullorEmpty(direccionLocal.getCodBarrio()) ? "N/A"
				: direccionLocal.getCodBarrio());
		sensibilizacion.setBarrio(OracleHelper.isNullorEmpty(direccionLocal
				.getValueNomBarrio()) ? "NO Disponible" : direccionLocal
				.getValueNomBarrio());
		sensibilizacion.setCodigoComuna(OracleHelper
				.isNullorEmpty(direccionLocal.getCodComuna()) ? "N/A"
				: direccionLocal.getCodComuna());
		sensibilizacion.setComuna(OracleHelper.isNullorEmpty(direccionLocal
				.getValueNomComuna()) ? "NO Disponible" : direccionLocal
				.getValueNomComuna());

		return "";
	}

	/**
	 * 
	 * @return
	 */
	public String create() {
		String msg = AppConstants.DEFAULT_ERROR;
		try {
			if (this.sensibilizacion.getId().longValue() == 0L) {
				// this.sensibilizacion.setId(new
				// Long(this.sensibilizacion.getIdStr()));
				this.sensibilizacion.setIdArea(new Long(this.sensibilizacion
						.getIdAreaStr()));
				this.sensibilizacion.setIdSensibilizacionTipo(new Long(
						this.sensibilizacion.getIdSensibilizacionTipoStr()));

				// checkAddress();
				sensibilizacion.setCodigoBarrio(OracleHelper
						.isNullorEmpty(direccionLocal.getCodBarrio()) ? "N/A"
						: direccionLocal.getCodBarrio());
				sensibilizacion
						.setBarrio(OracleHelper.isNullorEmpty(direccionLocal
								.getValueNomBarrio()) ? "NO Disponible"
								: direccionLocal.getValueNomBarrio());
				sensibilizacion.setCodigoComuna(OracleHelper
						.isNullorEmpty(direccionLocal.getCodComuna()) ? "N/A"
						: direccionLocal.getCodComuna());
				sensibilizacion
						.setComuna(OracleHelper.isNullorEmpty(direccionLocal
								.getValueNomComuna()) ? "NO Disponible"
								: direccionLocal.getValueNomComuna());

				getSensibilizacionService().insert(this.sensibilizacion);
				msg = AppConstants.SUCCESS_CREATE;
			}
		} catch (SensibilizacionException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		} catch (SensibilizacionRuntimeException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		}
		((MessageModalWindowController) getBean("messageController"))
				.setSuccessMessage("- Sensibilizacion " + msg, null, null);
		return AppConstants.SENSIBILIZACION_SEARCH_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String update() {
		String msg = AppConstants.DEFAULT_ERROR;
		try {
			if (this.sensibilizacion.getId().longValue() != 0L) {

				// no se debe editar el tipo de sensibilizacion
				// this.sensibilizacion.setIdSensibilizacionTipo(new
				// Long(this.sensibilizacion.getIdSensibilizacionTipoStr()));

				// checkAddress();
				sensibilizacion.setCodigoBarrio(OracleHelper
						.isNullorEmpty(direccionLocal.getCodBarrio()) ? "N/A"
						: direccionLocal.getCodBarrio());
				sensibilizacion
						.setBarrio(OracleHelper.isNullorEmpty(direccionLocal
								.getValueNomBarrio()) ? "NO Disponible"
								: direccionLocal.getValueNomBarrio());
				sensibilizacion.setCodigoComuna(OracleHelper
						.isNullorEmpty(direccionLocal.getCodComuna()) ? "N/A"
						: direccionLocal.getCodComuna());
				sensibilizacion
						.setComuna(OracleHelper.isNullorEmpty(direccionLocal
								.getValueNomComuna()) ? "NO Disponible"
								: direccionLocal.getValueNomComuna());

				getSensibilizacionService().update(this.sensibilizacion);
				msg = AppConstants.SUCCESS_UPDATE;
			}
		} catch (SensibilizacionException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		} catch (SensibilizacionRuntimeException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		}
		((MessageModalWindowController) getBean("messageController"))
				.setSuccessMessage("- Sensibilizacion " + msg, null, null);
		return AppConstants.SENSIBILIZACION_SEARCH_VIEW;
	}

	// --------------------------------------------------------------------
	// --- metodos para atender acciones end()
	// --------------------------------------------------------------------

	// --------------------------------------------------------------------
	// --- metodos para atender reglas de navegacion init()
	// --------------------------------------------------------------------

	/**
	 * 
	 */
	public String createSensibilizacion() {
		sensibilizacion = new Sensibilizacion();
		cleanValues();
		/**
		 * CARGA EL ULTIMO VALOR USADO POR LA SECUENCIA Y LE INCREMENTA UNO, EL
		 * CUAL SERA EL VALOR REAL CON EL QUE QUEDARA INSERTADO EL REGISTRO ESTE
		 * VALOR SE ENVIA AL JSP DE CREACION PARA QUE EL USUARIO LO ANOTE EN SU
		 * HOJA FISICAMENTE
		 */
		sensibilizacion
				.setCodigo(String.valueOf(Integer
						.parseInt(getSensibilizacionService()
								.getLastSequenceValue()) + 1));
		return AppConstants.SENSIBILIZACION_CREATE_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String updateSensibilizacion() {
		Map params = getExternalContext().getRequestParameterMap();
		String sensibilizacionDataIndex = (String) params
				.get("sensibilizacionDataIndex");
		this.sensibilizacion = (Sensibilizacion) ((List) this.sensibilizacionListModel
				.getWrappedData()).get(Integer
				.parseInt(sensibilizacionDataIndex));
		// Convierte los valores long en String para que se muestren en el
		// formulario
		// Sin estas lineas los selectOneMenu y los id que tiene un campo String
		// no cargan.
		this.sensibilizacion.setIdAreaStr(this.sensibilizacion.getIdArea()
				.toString());
		this.sensibilizacion.setIdSensibilizacionTipoStr(this.sensibilizacion
				.getIdSensibilizacionTipo().toString());
		return AppConstants.SENSIBILIZACION_UPDATE_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String cancelSensibilizacion() {
		cleanValues();
		cleanSearchValues();
		return AppConstants.SENSIBILIZACION_SEARCH_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String cancelSensibilizacionOpcion() {
		cleanValues();
		cleanSearchValues();
		return AppConstants.SENSIBILIZACION_MENU_VIEW;
	}

	// --------------------------------------------------------------------
	// --- metodos para atender reglas de navegacion end()
	// --------------------------------------------------------------------

	// --------------------------------------------------------------------
	// --- getters and setters init()
	// --------------------------------------------------------------------

	/**
	 * 
	 */
	public Sensibilizacion getSensibilizacionSearch() {
		return sensibilizacionSearch;
	}

	/**
	 * 
	 * @param sensibilizacionSearch
	 */
	public void setsensibilizacionSearch(Sensibilizacion sensibilizacionSearch) {
		this.sensibilizacionSearch = sensibilizacionSearch;
	}

	/**
	 * 
	 * @return
	 */
	public DataModel getsensibilizacionListModel() {
		return sensibilizacionListModel;
	}

	/**
	 * 
	 * @param sensibilizacionListModel
	 */
	public void setsensibilizacionListModel(DataModel sensibilizacionListModel) {
		this.sensibilizacionListModel = sensibilizacionListModel;
	}

	/**
	 * 
	 * @return
	 */
	public Sensibilizacion getSensibilizacion() {
		return sensibilizacion;
	}

	/**
	 * 
	 * @param sensibilizacion
	 */
	public void setsensibilizacion(Sensibilizacion sensibilizacion) {
		this.sensibilizacion = sensibilizacion;
	}

	/**
	 * obtencion del servicio sensibilizacionService
	 * 
	 * @return
	 */
	public ISensibilizacionService getSensibilizacionService() {
		return sensibilizacionService;
	}

	/**
	 * establecimiento del servicio sensibilizacionService, la inyeccion de la
	 * dependencia la cubre SpringFramework
	 * 
	 * @param sensibilizacionService
	 */
	public void setSensibilizacionService(
			ISensibilizacionService sensibilizacionService) {
		this.sensibilizacionService = sensibilizacionService;
	}

	/**
	 * @param geoUbicacionClient
	 *            the geoUbicacionClient to set
	 */
	public void setGeoUbicacionClient(GeoUbicacionClient geoUbicacionClient) {
		this.geoUbicacionClient = geoUbicacionClient;
	}

	/**
	 * @return the geoUbicacionClient
	 */
	public GeoUbicacionClient getGeoUbicacionClient() {
		return geoUbicacionClient;
	}

	// --------------------------------------------------------------------
	// --- getters and setters end()
	// --------------------------------------------------------------------

}
